package CUENTA;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.StringTokenizer;

import DATA.Writable;
import Motor.excepciones.EClaseNoValida;
import UTILIDADES.Categoria;

/**
 * Clase que maneja un movimiento concreto Todos los campos son finales de forma
 * que aunque se pasen los movimientos estos permanezcan constantes, forzando a 
 * que se sustituyan para modificarlos 
 *
 */
public class Movimiento implements Writable{
	/**
	 * Constructor completo de movimiento
	 * @param cuando	Date de cuando se hace
	 * @param concepto	Cadena que identifica el gasto
	 * @param categoria	Categoria que engloba el gasto
	 * @param cantidad
	 */
	public Movimiento(Date cuando, String concepto,Categoria categoria,int cantidad){
		_concepto=concepto;
		_categoria=categoria;
		set_cuando(cuando);
		_cantidad = cantidad;
	}
	
/**
 * Constructor vacio de Movimiento
 */
public Movimiento(){
	_cantidad =0;
	}

private Date _cuando;
protected Categoria _categoria;
protected String _concepto;
protected int _cantidad;

/**
 * @return la categoria asignada
 */
public Categoria get_categoria() {
	return _categoria;
}

/**
 * @return el concepto asignado
 */
public String get_concepto() {
	return _concepto;
}

/**
 * @return la cantidad asignada
 */
public int get_cantidad() {
	return _cantidad;
}

@Override
public String write() {
	DateFormat dfDefault = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.S");
	String line = "MOVIMIENTO " + dfDefault.format(_cuando) + " " 
			+ _categoria.write() + " " 
			+ _concepto + " " 
			+ new Integer(_cantidad);
	return line;
}
@Override
public Writable read(String input) throws EClaseNoValida, ParseException {
	StringTokenizer Token = new StringTokenizer(input);
	Movimiento movimiento = null;
	
	DateFormat dfDefault = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.S");
	Date auxiliarcuando = null;
	if (!Token.nextToken().equals("MOVIMIENTO")) 
		throw new EClaseNoValida();

	auxiliarcuando = dfDefault.parse(Token.nextToken());
	String auxiliar = Token.nextToken()+ " " + Token.nextToken()+ " " + Token.nextToken();
	Categoria auxiliarcategoria = (Categoria) new Categoria().read(auxiliar);
	
	String auxiliarconcepto = "";
	if(Token.hasMoreElements())
		auxiliarconcepto = Token.nextToken();
	int auxiliarcantidad = Integer.parseInt(Token.nextToken());
	movimiento = new Movimiento(auxiliarcuando
			,auxiliarconcepto
			,auxiliarcategoria,
			auxiliarcantidad);
	return movimiento;
}

/**
 * @return la fecha del movimiento
 */
public Date get_cuando() {
	return _cuando;
}

/**
 * @param _cuando la fecha a asignar
 */
public void set_cuando(Date cuando) {
	_cuando = cuando;
}
	

}
